#pragma once
#include "entt/entt.hpp"
#include "sysx/System.h"

#include "fxcc/core/Dir.h"
#include "fxcc/core/MetaCache.h"
#include "fxcc/core/audio/common/OggFile.h"
#include "fxcc/core/audio/common/WavFile.h"
#include "fxcc/core/audio/common/Maps.h"

#include "fxcc/core/audio/openal/Source.h"
#include "fxcc/core/audio/openal/World.h"

#include "fxcc/core/graph/common/Geometry.h"
#include "fxcc/core/graph/common/ProjSub.h"
#include "fxcc/core/graph/common/CameraData.h"
#include "fxcc/core/graph/common/LightData.h"
#include "fxcc/core/graph/common/BoneNode.h"
#include "fxcc/core/graph/common/Shapes.h"
#include "fxcc/core/graph/common/EffectsDesc.h"
#include "fxcc/core/graph/common/Maps.h"
#include "fxcc/core/graph/common/GraphImpl.h"
#include "fxcc/core/graph/common/ShaderLoader.h"
#include "fxcc/core/graph/common/EffectsLoader.h"
#include "fxcc/core/graph/common/AnimationController.h"
#include "fxcc/core/graph/common/AnimationNode.h"
#include "fxcc/core/graph/common/AnimNode.h"

#include "fxcc/core/graph/opengl3/Texture2DJack.h"
#include "fxcc/core/graph/opengl3/Texture3DJack.h"
#include "fxcc/core/graph/opengl3/Texture2DArrayJack.h"
#include "fxcc/core/graph/opengl3/TextureCubeJack.h"
#include "fxcc/core/graph/opengl3/TextureCubeArrayJack.h"
#include "fxcc/core/graph/opengl3/IBuffers.h"


#include "fxcc/core/graph/opengl3/MeshJack.h"
#include "fxcc/core/graph/opengl3/RenderTargetJack.h"
#include "fxcc/core/graph/opengl3/PickupEffect.h"
#include "fxcc/core/graph/opengl3/ImageEffect.h"
#include "fxcc/core/graph/opengl3/ssao/GBufferEffect.h"
#include "fxcc/core/graph/opengl3/phong/Material.h"
#include "fxcc/core/graph/opengl3/phong/Effect3d.h"
#include "fxcc/core/graph/opengl3/pbrx/HdrSkyboxDebugEffect.h"

#include "fxcc/core/Dir.h"

#include "fxcc/mono/Behivor.h"
#include "fxcc/mono/System.h"
#include "fxcc/mono/Clazz.h"
#include "fxcc/mono/Maps.h"

#include "fxcc/core/graph/common/TextLine.h"
#include "fxcc/core/graph/opengl3/font/Effect.h"
#include "fxcc/core/graph/opengl3/font/Factory.h"

#include "fxcc/core/graph/opengl3/ImGuiGlfwApp.h"

#include "PxPhysicsAPI.h"

// #ifdef _WIN32
// #ifdef FXCC_EXPORTS
// #define FXCC_API __declspec(dllexport)
// #else
// #define  __declspec(dllimport)
// #endif
// #else
// #define 
// #endif

namespace e2d
{
	using Input = fxcc::platform::common::Input;
	using SamplerType = fxcc::graph::common::SamplerType;
	using AttachmentType = fxcc::graph::common::AttachmentType;
	using Transform = fxcc::graph::common::Transform;
	using Frustum = fxcc::graph::common::Frustum;
	using Viewport = fxcc::graph::common::Viewport;
	using ProjSub = fxcc::graph::common::ProjSub;
	using Node = fxcc::graph::common::Node;
	using ModelScene = fxcc::graph::common::Scene;
	using Bones = fxcc::graph::common::Bones;
	using MonoClazz = mono::Clazz;
	using EffectsDesc = fxcc::graph::common::EffectsDesc;
	using EffectDesc = fxcc::graph::common::EffectDesc;

	using WavFile = fxcc::audio::common::WavFile;
	using OggFile = fxcc::audio::common::OggFile;

	using TextLine = fxcc::graph::common::TextLine;
	using Animation = fxcc::graph::common::Animation;
	using AnimChannel = fxcc::graph::common::Channel;
	using MaterialData = fxcc::graph::common::MaterialData;
	using MaterialView = fxcc::graph::common::MaterialView;
	using EffectToken = fxcc::graph::common::EffectToken;

	using Bone = fxcc::graph::common::Bone;
	using AABB = fxcc::graph::common::AABB;

	using ProjData = fxcc::graph::common::ProjData;
	using LightData = fxcc::graph::common::LightData;

	using BoxShape = fxcc::graph::common::BoxShape;
	using SphereShape = fxcc::graph::common::SphereShape;
	using PlaneShape = fxcc::graph::common::PlaneShape;
	using CapsuleShape = fxcc::graph::common::CapsuleShape;

	using MonoBehivorMap = mono::MonoBehivorMap;
	using MaterialViewMap = fxcc::graph::common::MaterialViewMap;
	using MeshMap = fxcc::graph::common::MeshMap;
	using SkinnedMeshMap = fxcc::graph::common::SkinnedMeshMap;
	using BoneFileMap = fxcc::graph::common::BoneFileMap;
	using AudioClipMap = fxcc::audio::common::AudioClipMap;
	using AnimationMap = fxcc::graph::common::AnimationMap;
	using TextureCubeMap = fxcc::graph::common::TextureCubeMap;
	using TextureCubeArrayMap = fxcc::graph::common::TextureCubeArrayMap;
	using Texture3DMap = fxcc::graph::common::Texture3DMap;
	using RenderTargetJack = fxcc::graph::common::RenderTargetJack;
	using Texture2DJack = fxcc::graph::common::Texture2DJack;
	using Texture2DMap = fxcc::graph::common::Texture2DMap;
	
	using BrdfTextureMap = fxcc::graph::common::BRDFTextureMap;
	using IrradianceTextureMap = fxcc::graph::common::IrradianceTextureMap;
	using PrefilterTextureMap = fxcc::graph::common::PrefilterTextureMap;
	using AnimationController = fxcc::graph::common::AnimationController;
	using AnimationNode = fxcc::graph::common::AnimationNode;

	using GraphImpl = fxcc::graph::common::GraphImpl;


};

// GraphConfig
namespace platform_ = fxcc::platform::glfw;
namespace graph_ = fxcc::graph::opengl3;

namespace e2d
{
	using Timer = platform_::GlfwTimer;
	using Texture2DArrayJack = graph_::Texture2DArrayJack;
	using TextureCubeJack = graph_::TextureCubeJack;
	using TextureCubeArrayJack = graph_::TextureCubeArrayJack;
	using MeshJack = graph_::MeshJack;
	using ImageEffect = graph_::ImageEffect;

	using Effect3d = graph_::Effect3d;
	using PickupEffect = graph_::PickupEffect;
	using UniformBuffer = graph_::UniformBuffer;
	using GBufferEffect = graph_::ssao::GBufferEffect;
	using SkyboxEffect = graph_::pbrx::HdrSkyboxDebugEffect;

	using FontEffect = graph_::font::Effect;
	using FontFactory = graph_::font::Factory;
	using PhongEffect = graph_::phong::Effect3d;


};
// Audio Config
namespace e2d
{
	using AudioSource = fxcc::audio::openal::Source;
	using AudioWorld = fxcc::audio::openal::World;

}
